/*
 * Sylvain BERTRAND <digital.ragnarok@gmail.com>
 * code protected by GNU GPL v3
 */
#include <X11/Xlib.h>
#include <glib.h>
#include <libxml/xinclude.h>
#include "../../toolkit/keyboard.h"
#include "../../toolkit/xml.h"
#include "../misc.h"
#include "../geom.h"
#include "../frame.h"
#include "../actions.h"
#include "../screen.h"
struct options {
	gboolean current;
	gboolean add;
};

static gpointer setup_func(xmlNodePtr node)
{
	xmlNodePtr n;
	struct options *o;
	o = g_slice_new0(struct options);
	if((n = t_xml_find_node(node, "where"))) {
		gchar *s = t_xml_node_string(n);
		if(!g_ascii_strcasecmp(s, "last"))
			o->current = FALSE;
		else if(!g_ascii_strcasecmp(s, "current"))
			o->current = TRUE;
		g_free(s);
	}
	return o;
}

static gpointer setup_add_func(xmlNodePtr node)
{
	struct options *o = setup_func(node);
	o->add = TRUE;
	return o;
}

static gpointer setup_remove_func(xmlNodePtr node)
{
	struct options *o = setup_func(node);
	o->add = FALSE;
	return o;
}

static void free_func(gpointer o)
{
	g_slice_free(struct options, o);
}

static gboolean run_func(struct wm_actions_data *data, gpointer options)
{
	struct options *o = options;
	actions_client_move(data, TRUE);
	if(o->add)
		screen_add_desktop(o->current);
	else
		screen_remove_desktop(o->current);
	actions_client_move(data, FALSE);
	return FALSE;
}

static gpointer setup_addcurrent_func(xmlNodePtr node)
{
	struct options *o = setup_add_func(node);
	o->current = TRUE;
	return o;
}

static gpointer setup_addlast_func(xmlNodePtr node)
{
	struct options *o = setup_add_func(node);
	o->current = FALSE;
	return o;
}

static gpointer setup_removecurrent_func(xmlNodePtr node)
{
	struct options *o = setup_remove_func(node);
	o->current = TRUE;
	return o;
}

static gpointer setup_removelast_func(xmlNodePtr node)
{
	struct options *o = setup_remove_func(node);
	o->current = FALSE;
	return o;
}

void action_addremovedesktop_startup(void)
{
	actions_register("AddDesktop", setup_add_func, free_func, run_func);
	actions_register("RemoveDesktop", setup_remove_func, free_func, run_func);
	actions_register("AddDesktopLast", setup_addlast_func, free_func, run_func);
	actions_register("RemoveDesktopLast", setup_removelast_func, free_func, run_func);
	actions_register("AddDesktopCurrent", setup_addcurrent_func, free_func, run_func);
	actions_register("RemoveDesktopCurrent", setup_removecurrent_func, free_func, run_func);
}
